//
//  RxAlamofireTestViewController.swift
//  iOS-RxSwift-Tutorials_Example
//
//  Created by mengru.tian on 2020/9/22.
//  Copyright © 2020 CocoaPods. All rights reserved.
//

import UIKit
import RxSwift
import RxAlamofire

class RxAlamofireTestViewController: UIViewController {

    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var cancelButton: UIButton!
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        test()
        test7()
    }
    
    // 使用 request 请求数据
    func test() {
        //创建URL对象
        let urlString = "https://www.douban.com/j/app/radio/channels"
        let url = URL(string:urlString)!
         
        //创建并发起请求
        request(.get, url)
            .data()
            .subscribe(onNext: {
                data in
                //数据处理
                let str = String(data: data, encoding: String.Encoding.utf8)
                print("返回的数据是：", str ?? "")
            }).disposed(by: disposeBag)
    }
    
    // 如果还要处理失败的情况，可以在 onError 回调中操作
    func test2() {
        //创建URL对象
        let urlString = "https://www.douban.com/jxxxxxxxx/app/radio/channels"
        let url = URL(string:urlString)!
         
        //创建并发起请求
        request(.get, url)
            .data()
            .subscribe(onNext: {
                data in
                //数据处理
                let str = String(data: data, encoding: String.Encoding.utf8)
                print("返回的数据是：", str ?? "")
            }, onError: { error in
                print("请求失败！错误原因：", error)
            }).disposed(by: disposeBag)
    }
    
    // 使用 requestData 请求数据
    func test3() {
        //创建URL对象
        let urlString = "https://www.douban.com/j/app/radio/channels"
        let url = URL(string:urlString)!
         
        //创建并发起请求
        requestData(.get, url).subscribe(onNext: {
            response, data in
            //数据处理
            let str = String(data: data, encoding: String.Encoding.utf8)
            print("返回的数据是：", str ?? "")
        }).disposed(by: disposeBag)
    }
    
    // 使用 requestData 的话，不管请求成功与否都会进入到 onNext 这个回调中。如果我们想要根据响应状态进行一些相应操作，通过 response 参数即可实现。
    func test4() {
        //创建URL对象
        let urlString = "https://www.douban.com/jxxxxxxx/app/radio/channels"
        let url = URL(string:urlString)!
         
        //创建并发起请求
        requestData(.get, url).subscribe(onNext: {
            response, data in
            //判断响应结果状态码
            if 200 ..< 300 ~= response.statusCode {
                let str = String(data: data, encoding: String.Encoding.utf8)
                print("请求成功！返回的数据是：", str ?? "")
            }else{
                print("请求失败！")
            }
        }).disposed(by: disposeBag)
    }
    
    // 获取 String 类型数据
    func test5() {
        //创建URL对象
        let urlString = "https://www.douban.com/j/app/radio/channels"
        let url = URL(string:urlString)!
         
        //创建并发起请求
        request(.get, url)
            .responseString()
            .subscribe(onNext: {
                response, data in
                //数据处理
                print("返回的数据是：", data)
            }).disposed(by: disposeBag)
    }
    
    // 当然更简单的方法就是直接使用 requestString 去获取数据。
    func test6() {
        //创建URL对象
        let urlString = "https://www.douban.com/j/app/radio/channels"
        let url = URL(string:urlString)!
         
        //创建并发起请求
        requestString(.get, url)
            .subscribe(onNext: {
                response, data in
                //数据处理
                print("返回的数据是：", data)
            }).disposed(by: disposeBag)
    }
    
    // 手动发起请求、取消请求
    func test7() {
        //创建URL对象
        let urlString = "https://www.douban.com/j/app/radio/channels"
        let url = URL(string:urlString)!
         
        //发起请求按钮点击
        startButton.rx.tap.asObservable()
            .flatMap {
                request(.get, url).responseString()
                    .takeUntil(self.cancelButton.rx.tap) //如果“取消按钮”点击则停止请求
            }
            .subscribe(onNext: {
                response, data in
                print("请求成功！返回的数据是：", data)
            }, onError: { error in
                print("请求失败！错误原因：", error)
            }).disposed(by: disposeBag)
    }
}
